package ss.pku.jsa.type.inference;

import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;

public class Tester implements IApplication {
	public static void test1() {
//		ObjectQType q1 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q1", true);
//
//		ObjectQType q2 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q2", true);
//
//		Constraint.addConstraint(q1, q2, QualGate.EMPTY, new Location("new",
//				0L, 0L), 0, "make constraint");
//
//		ObjectQType x1 = new ObjectQType("B", new Location("test", 0L, 0L),
//				"x1", true);
//		RefQType rx1 = new RefQType(new Location("test", 0L, 0L), true, x1,
//				false);
//		q1.addFieldQType("rx1", rx1);
//
//		ObjectQType x2 = new ObjectQType("B", new Location("test", 0L, 0L),
//				"x2", true);
//		RefQType rx2 = new RefQType(new Location("test", 0L, 0L), true, x2,
//				false);
//		q2.addFieldQType("rx2", rx2);
//
//		ObjectQType x1y = new ObjectQType("C", new Location("test", 0L, 0L),
//				"x1y", true);
//		RefQType rx1y = new RefQType(new Location("test", 0L, 0L), true, x1y,
//				false);
//		x1.addFieldQType("rx1y", rx1y);
//
//		ObjectQType x2y = new ObjectQType("C", new Location("test", 0L, 0L),
//				"x2y", true);
//		RefQType rx2y = new RefQType(new Location("test", 0L, 0L), true, x2y,
//				false);
//		x2.addFieldQType("rx2y", rx2y);
//
//		ObjectQType z = new ObjectQType("Z", new Location("test", 0L, 0L), "z",
//				true);
//
//		Constraint.addConstraint(z, x1y, QualGate.EMPTY, new Location("new",
//				0L, 0L), 1, "Outside edge");
//
//		JqualPlugin.analysis.propogateConstraints();
//		System.out.println(JqualPlugin.analysis.dumpObjects());
	}

	void test2() {
//		ObjectQType q1 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q1", true);
//
//		ObjectQType q2 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q2", true);
//
//		ObjectQType x1 = new ObjectQType("B", new Location("test", 0L, 0L),
//				"x", true);
//		RefQType rx1 = new RefQType(new Location("test", 0L, 0L), true, x1,
//				false);
//		q1.addFieldQType("rx", rx1);
//
//		ObjectQType x2 = new ObjectQType("B", new Location("test", 0L, 0L),
//				"x", true);
//		RefQType rx2 = new RefQType(new Location("test", 0L, 0L), true, x2,
//				false);
//		q2.addFieldQType("rx", rx2);
//
//		ObjectQType x1y = new ObjectQType("C", new Location("test", 0L, 0L),
//				"y", true);
//		RefQType rx1y = new RefQType(new Location("test", 0L, 0L), true, x1y,
//				false);
//		x1.addFieldQType("ry", rx1y);
//
//		ObjectQType x2y = new ObjectQType("C", new Location("test", 0L, 0L),
//				"y", true);
//		RefQType rx2y = new RefQType(new Location("test", 0L, 0L), true, x2y,
//				false);
//		x2.addFieldQType("ry", rx2y);
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
//
//		System.out.println("-------------------------------------------------");
//
//		q1.merge(q2, new Location("MERGE", 0L, 0L), "Merge q1 with q2");
//
//		JqualPlugin.analysis.propogateConstraints();
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
//
//		System.out.println("-------------------------------------------------");
//
//		ObjectQType q3 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q3", true);
//
//		Constraint.addConstraint(q3, x1, QualGate.EMPTY, new Location("new",
//				0L, 0L), 1, "Outside edge");
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
	}

//	private void moveConstraints(ObjectQType from, ObjectQType to) {
//		for (Iterator i = new ArrayList(from.getConstraints()).iterator(); i
//				.hasNext();) {
//			Object o = i.next();
//			Constraint c = null;
//			if ((o instanceof ConstraintRev)) {
//				((ConstraintRev) o).moveTarget(to);
//			} else {
//				c = (Constraint) o;
//
//				c.moveSource(to);
//			}
//		}
//	}

	void testMoveConstraint() {
//		ObjectQType q1 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q1", true);
//
//		ObjectQType q2 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q2", true);
//
//		ObjectQType q3 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q3", true);
//
//		ObjectQType q4 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q4", true);
//
//		Constraint.addConstraint(q1, q2, QualGate.EMPTY, new Location("new",
//				0L, 0L), 1, "Outside edge");
//		Constraint.addConstraint(q3, q1, QualGate.EMPTY, new Location("new",
//				0L, 0L), 1, "Outside edge");

//		System.out.println(JqualPlugin.analysis.dumpObjects());
//
//		System.out.println("-------------------------------------------------");
//
//		moveConstraints(q1, q4);
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
	}

	void testC1() {
//		ObjectQType q1 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q1", true);
//
//		ObjectQType q3 = new ObjectQType("A", new Location("test", 0L, 0L),
//				"Q3", true);
//
//		QType a1 = new PrimitiveQType("int", new Location("test", 0L, 0L), "a",
//				true);
//		QType a3 = new PrimitiveQType("int", new Location("test", 0L, 0L), "a",
//				true);
//		RefQType ra1 = new RefQType(new Location("test", 0L, 0L), true, a1,
//				false);
//		RefQType ra3 = new RefQType(new Location("test", 0L, 0L), true, a3,
//				false);
//		q1.addFieldQType("a", ra1);
//
//		Constraint.addConstraint(q1, q3, QualGate.EMPTY, new Location("new",
//				0L, 0L), 0, "make constraint");
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
//
//		JqualPlugin.printlnLog("constraintLog",
//				"---------------------------------------");
//
//		JqualPlugin.analysis.propogateConstraints();
//
//		System.out.println(JqualPlugin.analysis.dumpObjects());
	}

	public Object run(Object args) throws Exception {
		JqualPlugin.prepareForAnalysis();
		testC1();

		return null;
	}

//	static ObjectQType newInstance(String type, String name) {
//		Location l = new Location("test", 0L, 0L);
//		ObjectQType ret = new ObjectQType(type, l, name, true);
//
//		return ret;
//	}

	@Override
	public Object start(IApplicationContext arg0) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub

	}
}
